package com.sromku.bugsnag.views;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.preference.PreferenceDialog;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.dialogs.PreferencesUtil;
import org.eclipse.ui.part.ViewPart;
import com.sromku.bugsnag.Activator;
import com.sromku.bugsnag.actions.OpenEditorAction;
import com.sromku.bugsnag.dialog.ConfigureColumnsDialog;
import com.sromku.bugsnag.model.Account;
import com.sromku.bugsnag.model.ColumnInfo;
import com.sromku.bugsnag.model.Project;
import com.sromku.bugsnag.preferences.PreferencesManager;
import com.sromku.bugsnag.preferences.PreferencesManager.OnChangeListener;
import com.sromku.bugsnag.providers.ErrorsContentProvider;
import com.sromku.bugsnag.providers.ErrorsLabelProvider;
import com.sromku.bugsnag.utils.SelectionListenersStore;
/**
* @author sromku
*/
public class BugsnagView extends ViewPart {
/**
* The ID of the view as specified by the extension.
*/
public static final String ID = "com.sromku.bugsnag.views.BugsnagView";
private TableViewer viewer;
private Action doubleClickAction;
private ErrorsLabelProvider errorsLabelProvider;
private Object data;
public BugsnagView() {
PreferencesManager.addOnChangeListener(new OnChangeListener() {
@Override
public void onChanged() {
createColumns();
viewer.setInput(data);
}
});
}
public void createPartControl(Composite parent) {
viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER);
// create columns
createColumns();
Table table = viewer.getTable();
table.setHeaderVisible(true);
table.setLinesVisible(true);
viewer.setContentProvider(new ErrorsContentProvider());
errorsLabelProvider = new ErrorsLabelProvider();
viewer.setLabelProvider(errorsLabelProvider);
// viewer.setSorter(new NameSorter());
makeActions();
contributeToActionBars();
}
public void setData(Object object) {
this.data = object;
viewer.setInput(object);
}
/**
* Create and set actions
*/
private void makeActions() {
doubleClickAction = new OpenEditorAction(viewer);
viewer.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
doubleClickAction.run();
}
});
}
private void contributeToActionBars() {
IActionBars bars = getViewSite().getActionBars();
IMenuManager menuManager = bars.getMenuManager();
// Submenu of all projects
final MenuManager menuProjects = new MenuManager("Projects");
menuProjects.addMenuListener(new IMenuListener() {
@Override
public void menuAboutToShow(IMenuManager manager) {
manager.removeAll();
Project selectedProjectApi = PreferencesManager.getDefaultProject();
List<Project> values = new ArrayList<Project>();
ArrayList<Account> accounts = PreferencesManager.getAccounts();
for (Account account : accounts) {
values.addAll(account.projects);
}
if (values.size() > 0) {
for (Project project : values) {
menuProjects.add(new ToggleAction(project, project.equals(selectedProjectApi)));
}
} else {
menuProjects.add(new AddNewProject());
}
}
});
// hack: have to add this shit, because this will make the real menu to
// be shown.
menuProjects.add(new Action("temp") {
});
// add submenu
menuManager.add(menuProjects);
// add separtor
menuManager.add(new Separator());
// add configure columns
menuManager.add(new SelectColumnsAction());
}
public class ToggleAction extends Action {
private Project project;
public ToggleAction(Project projectModel, boolean selected) {
super(projectModel.name);
this.project = projectModel;
setChecked(selected);
}
@Override
public void run() {
PreferencesManager.setDefaultProject(project);
}
}
public class SelectColumnsAction extends Action {
public SelectColumnsAction() {
super("Configure columns...");
}
@Override
public void run() {
Activator.runOnUIThread(new Runnable() {
@Override
public void run() {
ConfigureColumnsDialog columnsDialog = new ConfigureColumnsDialog(getViewSite().getShell());
columnsDialog.open();
}
});
}
}
public class AddNewProject extends Action {
public AddNewProject() {
super("Add new...");
}
@Override
public void run() {
String preferencePageId = "com.sromku.bugsnag.preferences.BugsnagPreferencePage";
PreferenceDialog pref = PreferencesUtil.createPreferenceDialogOn(getSite().getWorkbenchWindow().getShell(), preferencePageId, null, null);
pref.open();
}
}
/**
* Create columns
*/
private void createColumns() {
// clean all columns
if (viewer != null) {
TableColumn[] columns = viewer.getTable().getColumns();
for (int i = 0; i < columns.length; i++) {
columns[i].dispose();
}
for (final ColumnInfo columnInfo : PreferencesManager.getSelectedColumns()) {
if (columnInfo.selected) {
TableViewerColumn colStatus = new TableViewerColumn(viewer, SWT.NONE);
colStatus.getColumn().setWidth(columnInfo.width);
colStatus.getColumn().setText(columnInfo.name);
colStatus.setLabelProvider(new CellLabelProvider() {
@Override
public void update(ViewerCell cell) {
String data = errorsLabelProvider.getColumnText(cell.getElement(), columnInfo);
cell.setText(data);
}
});
}
}
}
}
public TableViewer getViewer() {
return viewer;
}
public void refresh() {
getViewer().refresh();
}
/**
* Passing the focus request to the viewer's control.
*/
public void setFocus() {
viewer.getControl().setFocus();
}
@Override
public void dispose() {
List<ISelectionListener> iSelectionListeners = SelectionListenersStore.getISelectionListeners();
for (ISelectionListener iSelectionListener : iSelectionListeners) {
getSite().getWorkbenchWindow().getSelectionService().removeSelectionListener(iSelectionListener);
}
SelectionListenersStore.clear();
super.dispose();
}
}